/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.model;

/**
 * @author Administrador
 */
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import com.db.SqlManager;
import com.exception.DataException;
import com.javabeans.*;
import java.util.ArrayList;
import java.util.List;

public class AdminEstudiante implements EstudianteManager{
    private Connection c;

    public AdminEstudiante(Connection c){
        this.c = c;
    }
    @Override
    public List<Estudiante> getEstudiantesActivos() throws DataException {
        List<Estudiante> estudiantes = new ArrayList<Estudiante>();
        try{
            estudiantes = this.getEstudiantes(true);
        }catch(DataException e){
            throw new DataException(" AdminEstudiante -> getEstudiantesActivos() "+e.getMessage());
        }
        return estudiantes;
    }
    @Override
    public List<Estudiante> getEstudiantesInactivos() throws DataException {
        List<Estudiante> estudiantes = new ArrayList<Estudiante>();
        try{
            estudiantes = this.getEstudiantes(false);
        }catch(DataException e){
            throw new DataException(" AdminEstudiante -> getEstudiantesInactivos() "+e.getMessage());
        }
        return estudiantes;
    }
    
    @Override
    public Estudiante validarEstudiante(int idEstudiante, String ci) throws DataException{
        Estudiante e = new Estudiante();
        ResultSet rs = null;
        PreparedStatement preSt = null;
        try{
            String query = "SELECT NOMBRE";
            query += ", APELLIDO_PA";
            query += ", APELLIDO_MA";
            query += ", CI";
            query += ", EXPEDIDOEN";
            query += ", PASSWORD";
            query += ", GENERO";
            query += ", TELEFONO";
            query += ", DIRECCION";
            query += ", DATE_FORMAT(FECHANAC,'%d/%m/%Y') FECHA_NAC";
            query += ", FOTO";
            query += ", ESTADO";
            query += " FROM ESTUDIANTE";
            query += " WHERE IDESTUDIANTE="+idEstudiante;
            query += " AND PASSWORD='"+ci+"' AND ESTADO = 1";            
            preSt = c.prepareStatement(query);
            rs = preSt.executeQuery();
            if(rs.next()){
                e.setIdEstudiante(idEstudiante);// cod_sis
                e.setNombre(rs.getString("NOMBRE"));
                e.setApellidoPa(rs.getString("APELLIDO_PA"));
                e.setApellidoMa(rs.getString("APELLIDO_MA"));
                e.setCi(rs.getString("CI"));
                e.setExpedidoEn(rs.getString("EXPEDIDOEN"));
                e.setGenero(rs.getString("GENERO").charAt(0));
                e.setTelefono(rs.getString("TELEFONO"));
                e.setDireccion(rs.getString("DIRECCION"));
                e.setPassword(rs.getString("PASSWORD"));
                e.setFechaNac(rs.getString("FECHA_NAC"));
                e.setFoto(rs.getString("FOTO"));
                e.setEstado(rs.getInt("ESTADO"));
            }
        }catch(SQLException ex){
            throw new DataException(" AdminEstudiante -> validarEstudiante(idEstudiante, ci) e = "+ex.getMessage());
        }finally{
            SqlManager.closeRs(rs);
            SqlManager.closePreSt(preSt);
        }
        return e;
    }    
    public List<Estudiante> getEstudiantes(boolean activo) throws DataException{
        List<Estudiante> estudiantes = new ArrayList<Estudiante>();
        ResultSet rs = null;
        PreparedStatement preSt = null;
        String query = "";
        try{
            query = "SELECT E.IDESTUDIANTE";
            query += ", E.NOMBRE";
            query += ", E.APELLIDO_PA";
            query += ", E.APELLIDO_MA";
            query += ", E.CI";
            query += ", E.PASSWORD";
            query += ", E.EXPEDIDOEN";
            query += ", E.GENERO";
            query += ", E.TELEFONO";
            query += ", E.EMAIL";
            query += ", E.DIRECCION";
            query += ", DATE_FORMAT(E.FECHANAC,'%d/%m/%Y') AS FECHANAC";
            query += ", E.FOTO";
            query += ", PA.IDPAIS, PA.NOMBRE, PA.SIGLA";
            query += ", C.IDCIUDAD, C.NOMBRE, C.SIGLA";
            query += ", P.IDPROVINCIA, P.NOMBRE, P.SIGLA";
            query += ", DE_AC.LOCALIDAD_ACTUAL, DE_AC.CANTON_ACTUAL";
            query += ", PAN.IDPAIS, PAN.NOMBRE, PAN.SIGLA";
            query += ", CN.IDCIUDAD, CN.NOMBRE, CN.SIGLA";
            query += ", PN.IDPROVINCIA, PN.NOMBRE, PN.SIGLA";
            query += ", DE_NAC.LOCALIDAD_NAC, DE_NAC.CANTON_NAC";
            query += " FROM ESTUDIANTE E";
            query += " INNER JOIN ( DETALLE_ESTUDIANTE DE_AC INNER JOIN (PROVINCIA P INNER JOIN (CIUDAD C INNER JOIN PAIS PA ON C.IDPAIS = PA.IDPAIS) ON P.IDPAIS = C.IDPAIS AND P.IDCIUDAD=C.IDCIUDAD) ON DE_AC.IDPAIS_ACTUAL=P.IDPAIS AND DE_AC.IDCIUDAD_ACTUAL=P.IDCIUDAD AND DE_AC.IDPROVINCIA_ACTUAL=P.IDPROVINCIA )";
            query += " ON E.IDESTUDIANTE=DE_AC.IDDETALLE_ESTUDIANTE";
            query += " INNER JOIN ( DETALLE_ESTUDIANTE DE_NAC INNER JOIN (PROVINCIA PN INNER JOIN (CIUDAD CN INNER JOIN PAIS PAN ON CN.IDPAIS = PAN.IDPAIS) ON PN.IDPAIS = CN.IDPAIS AND PN.IDCIUDAD=CN.IDCIUDAD) ON DE_NAC.IDPAIS_NAC=PN.IDPAIS AND DE_NAC.IDCIUDAD_NAC=PN.IDCIUDAD AND DE_NAC.IDPROVINCIA_NAC=PN.IDPROVINCIA )";
            query += " ON E.IDESTUDIANTE=DE_NAC.IDDETALLE_ESTUDIANTE";
            if(activo)
                query += " AND E.ESTADO = 1";
            else
                query += " AND E.ESTADO = 0";
            query += " ORDER BY E.APELLIDO_PA, E.NOMBRE";           
            preSt = c.prepareStatement(query);
            rs = preSt.executeQuery();
            while(rs.next()){
                Estudiante e = new Estudiante();
                e.setIdEstudiante(rs.getInt("IDESTUDIANTE"));
                e.setNombre(rs.getString("E.NOMBRE"));
                e.setApellidoPa(rs.getString("APELLIDO_PA"));
                e.setApellidoMa(rs.getString("APELLIDO_MA"));
                e.setCi(rs.getString("CI"));
                e.setPassword(rs.getString("PASSWORD"));
                e.setExpedidoEn(rs.getString("EXPEDIDOEN"));
                e.setGenero(rs.getString("GENERO").charAt(0));
                e.setTelefono(rs.getString("TELEFONO"));
                e.setEmail(rs.getString("EMAIL"));
                e.setDireccion(rs.getString("DIRECCION"));
                e.setFechaNac(rs.getString("FECHANAC"));
                e.setFoto(rs.getString("FOTO"));
                // =========================== ACTUAL AC ===========================
                Pais pa_ac = new Pais();
                pa_ac.setIdPais(rs.getInt("PA.IDPAIS"));
                pa_ac.setNombre(rs.getString("PA.NOMBRE"));
                pa_ac.setSigla(rs.getString("PA.SIGLA"));

                Ciudad ci_ac = new Ciudad();
                ci_ac.setIdCiudad(rs.getInt("C.IDCIUDAD"));
                ci_ac.setNombre(rs.getString("C.NOMBRE"));
                ci_ac.setSigla(rs.getString("C.SIGLA"));
                
                Provincia p_ac = new Provincia();
                p_ac.setIdProvincia(rs.getInt("P.IDPROVINCIA"));
                p_ac.setNombre(rs.getString("P.NOMBRE"));
                p_ac.setSigla(rs.getString("P.SIGLA"));
                
                DetalleEstudiante de = new DetalleEstudiante();
                de.setLocalidadActual(rs.getString("DE_AC.LOCALIDAD_ACTUAL"));
                de.setCantonActual(rs.getString("DE_AC.CANTON_ACTUAL"));
                de.setPaisActual(pa_ac);
                de.setCiudadActual(ci_ac);
                de.setProvinciaActual(p_ac);       
                
                // =========================== NACIMIENTO NAC ===========================
                Pais pa_nac = new Pais();
                pa_nac.setIdPais(rs.getInt("PAN.IDPAIS"));
                pa_nac.setNombre(rs.getString("PAN.NOMBRE"));
                pa_nac.setSigla(rs.getString("PAN.SIGLA"));

                Ciudad ci_nac = new Ciudad();
                ci_nac.setIdCiudad(rs.getInt("CN.IDCIUDAD"));
                ci_nac.setNombre(rs.getString("CN.NOMBRE"));
                ci_nac.setSigla(rs.getString("CN.SIGLA"));
                
                Provincia p_nac = new Provincia();
                p_nac.setIdProvincia(rs.getInt("PN.IDPROVINCIA"));
                p_nac.setNombre(rs.getString("PN.NOMBRE"));
                p_nac.setSigla(rs.getString("PN.SIGLA"));
                
                de.setLocalidadNac(rs.getString("DE_NAC.LOCALIDAD_NAC"));
                de.setCantonNac(rs.getString("DE_NAC.CANTON_NAC"));
                de.setPaisNacimiento(pa_nac);
                de.setCiudadNacimiento(ci_nac);
                de.setProvinciaNacimiento(p_nac);
                
                e.setDetalleEstudiante(de);
                
                estudiantes.add(e);
            }
        }catch(SQLException e){
            throw new DataException("Error! AdminEstudiante -> getEstudiantes(boolean activo) e = "+e.getMessage());
        }finally{
            SqlManager.closeRs(rs);
            SqlManager.closePreSt(preSt);
        }
        return estudiantes;
    }
    @Override
    public void saveEstudiante(Estudiante e) throws DataException {
        PreparedStatement preSt = null;
        String query;
        try{
            query ="INSERT INTO ESTUDIANTE VALUES("+e.getIdEstudiante();
            query+= ", '"+e.getNombre().toUpperCase();
            query+= "', '"+e.getApellidoPa().toUpperCase();
            query+= "', '"+e.getApellidoMa().toUpperCase();
            query+= "', '"+e.getCi();
            query+= "', '"+e.getPassword();
            query+= "', '"+e.getExpedidoEn().toUpperCase();
            query+= "', '"+e.getGenero();
            query+= "', '"+e.getTelefono();
            query+= "', '"+e.getEmail();
            query+= "', '"+e.getDireccion().toUpperCase();
            query+= "', '"+e.getFechaNac();
            query+= "', '"+e.getFoto();
            query+= "', "+e.getEstado()+")";            
            preSt = c.prepareStatement(query);
            preSt.executeUpdate();
        }catch(SQLException ex){
            throw new DataException(" AdminEstudiante -> saveEstudiante(Estudiante e) "+ex.getMessage());
        }finally{
            SqlManager.closePreSt(preSt);
        }
    }

    public Estudiante getEstudiante(int idEstudiante) throws DataException {
        Estudiante es = new Estudiante();
        ResultSet rs = null;
        PreparedStatement preSt = null;
        String query = "";
        try{
            query = "SELECT E.NOMBRE";
            query += ", E.APELLIDO_PA";
            query += ", E.APELLIDO_MA";
            query += ", E.CI";
            query += ", E.PASSWORD";
            query += ", E.EXPEDIDOEN";
            query += ", E.GENERO";
            query += ", E.TELEFONO";
            query += ", E.EMAIL";
            query += ", E.DIRECCION";
            query += ", DATE_FORMAT(E.FECHANAC,'%d/%m/%Y') AS FECHANAC";
            query += ", E.FOTO";
            query += ", PA.IDPAIS, PA.NOMBRE, PA.SIGLA";
            query += ", C.IDCIUDAD, C.NOMBRE, C.SIGLA";
            query += ", P.IDPROVINCIA, P.NOMBRE, P.SIGLA";
            query += ", DE_AC.LOCALIDAD_ACTUAL, DE_AC.CANTON_ACTUAL";
            query += ", PAN.IDPAIS, PAN.NOMBRE, PAN.SIGLA";
            query += ", CN.IDCIUDAD, CN.NOMBRE, CN.SIGLA";
            query += ", PN.IDPROVINCIA, PN.NOMBRE, PN.SIGLA";
            query += ", DE_NAC.LOCALIDAD_NAC, DE_NAC.CANTON_NAC";
            query += " FROM ESTUDIANTE E";
            query += " INNER JOIN ( DETALLE_ESTUDIANTE DE_AC INNER JOIN (PROVINCIA P INNER JOIN (CIUDAD C INNER JOIN PAIS PA ON C.IDPAIS = PA.IDPAIS) ON P.IDPAIS = C.IDPAIS AND P.IDCIUDAD=C.IDCIUDAD) ON DE_AC.IDPAIS_ACTUAL=P.IDPAIS AND DE_AC.IDCIUDAD_ACTUAL=P.IDCIUDAD AND DE_AC.IDPROVINCIA_ACTUAL=P.IDPROVINCIA )";
            query += " ON E.IDESTUDIANTE=DE_AC.IDDETALLE_ESTUDIANTE";
            query += " INNER JOIN ( DETALLE_ESTUDIANTE DE_NAC INNER JOIN (PROVINCIA PN INNER JOIN (CIUDAD CN INNER JOIN PAIS PAN ON CN.IDPAIS = PAN.IDPAIS) ON PN.IDPAIS = CN.IDPAIS AND PN.IDCIUDAD=CN.IDCIUDAD) ON DE_NAC.IDPAIS_NAC=PN.IDPAIS AND DE_NAC.IDCIUDAD_NAC=PN.IDCIUDAD AND DE_NAC.IDPROVINCIA_NAC=PN.IDPROVINCIA )";
            query += " ON E.IDESTUDIANTE=DE_NAC.IDDETALLE_ESTUDIANTE";
            query += " AND E.ESTADO = 1 AND E.IDESTUDIANTE="+idEstudiante;
            query += " ORDER BY E.APELLIDO_PA, E.NOMBRE LIMIT 1";            
            
            preSt = c.prepareStatement(query);
            rs = preSt.executeQuery();
            while(rs.next()){
                es.setIdEstudiante(idEstudiante);
                es.setNombre(rs.getString("E.NOMBRE"));
                es.setApellidoPa(rs.getString("APELLIDO_PA"));
                es.setApellidoMa(rs.getString("APELLIDO_MA"));
                es.setCi(rs.getString("CI"));
                es.setPassword(rs.getString("PASSWORD"));
                es.setExpedidoEn(rs.getString("EXPEDIDOEN"));
                es.setGenero(rs.getString("GENERO").charAt(0));
                es.setTelefono(rs.getString("TELEFONO"));
                es.setEmail(rs.getString("EMAIL"));
                es.setDireccion(rs.getString("DIRECCION"));
                es.setFechaNac(rs.getString("FECHANAC"));
                es.setFoto(rs.getString("FOTO"));
                // =========================== ACTUAL AC ===========================
                Pais pa_ac = new Pais();
                pa_ac.setIdPais(rs.getInt("PA.IDPAIS"));
                pa_ac.setNombre(rs.getString("PA.NOMBRE"));
                pa_ac.setSigla(rs.getString("PA.SIGLA"));

                Ciudad ci_ac = new Ciudad();
                ci_ac.setIdCiudad(rs.getInt("C.IDCIUDAD"));
                ci_ac.setNombre(rs.getString("C.NOMBRE"));
                ci_ac.setSigla(rs.getString("C.SIGLA"));
                
                Provincia p_ac = new Provincia();
                p_ac.setIdProvincia(rs.getInt("P.IDPROVINCIA"));
                p_ac.setNombre(rs.getString("P.NOMBRE"));
                p_ac.setSigla(rs.getString("P.SIGLA"));
                
                DetalleEstudiante de = new DetalleEstudiante();
                de.setLocalidadActual(rs.getString("DE_AC.LOCALIDAD_ACTUAL"));
                de.setCantonActual(rs.getString("DE_AC.CANTON_ACTUAL"));
                de.setPaisActual(pa_ac);
                de.setCiudadActual(ci_ac);
                de.setProvinciaActual(p_ac);       
                
                // =========================== NACIMIENTO NAC ===========================
                Pais pa_nac = new Pais();
                pa_nac.setIdPais(rs.getInt("PAN.IDPAIS"));
                pa_nac.setNombre(rs.getString("PAN.NOMBRE"));
                pa_nac.setSigla(rs.getString("PAN.SIGLA"));

                Ciudad ci_nac = new Ciudad();
                ci_nac.setIdCiudad(rs.getInt("CN.IDCIUDAD"));
                ci_nac.setNombre(rs.getString("CN.NOMBRE"));
                ci_nac.setSigla(rs.getString("CN.SIGLA"));
                
                Provincia p_nac = new Provincia();
                p_nac.setIdProvincia(rs.getInt("PN.IDPROVINCIA"));
                p_nac.setNombre(rs.getString("PN.NOMBRE"));
                p_nac.setSigla(rs.getString("PN.SIGLA"));
                
                
                de.setLocalidadNac(rs.getString("DE_NAC.LOCALIDAD_NAC"));
                de.setCantonNac(rs.getString("DE_NAC.CANTON_NAC"));
                de.setPaisNacimiento(pa_nac);
                de.setCiudadNacimiento(ci_nac);
                de.setProvinciaNacimiento(p_nac);
                
                es.setDetalleEstudiante(de);     
                
            }
        }catch(SQLException e){
            throw new DataException("Error! AdminEstudiante -> getEstudiante(idEstudiante) e = "+e.getMessage());
        }finally{
            SqlManager.closeRs(rs);
            SqlManager.closePreSt(preSt);
        }
        return es;
    }

    public void updateEstudiante(Estudiante e) throws DataException {
        PreparedStatement preSt = null;
        try{
            String query = "UPDATE ESTUDIANTE SET NOMBRE = '"+e.getNombre().toUpperCase();
            query+= "', APELLIDO_PA = '"+e.getApellidoPa().toUpperCase();
            query+= "', APELLIDO_MA = '"+e.getApellidoMa().toUpperCase();
            query+= "', CI = '"+e.getCi();
            query+= "', EXPEDIDOEN = '"+e.getExpedidoEn().toUpperCase();
            query+= "', GENERO = '"+e.getGenero();
            query+= "', TELEFONO = '"+e.getTelefono();
            query+= "', EMAIL = '"+e.getEmail();
            query+= "', DIRECCION = '"+e.getDireccion().toUpperCase();
            query+= "', FECHANAC = '"+e.getFechaNac();
            query+= "' WHERE IDESTUDIANTE="+e.getIdEstudiante();
            preSt = c.prepareStatement(query);
            preSt.executeUpdate();
        }catch(SQLException ex){
            throw new DataException(" AdminEstudiante -> updateEstudiante(Estudiante e) e = "+ex.getMessage());
        }finally{
            SqlManager.closePreSt(preSt);
        }
    }
    @Override
    public void darBajaEstudiante(int idEstudiante) throws DataException {
        try{
            this.darAltaBaja(false, idEstudiante);
        }catch(DataException e){
            throw new DataException(" AdminEstudiante -> darBajaEstudiante(idEstudiante) "+e.getMessage());
        }
    }
    @Override
    public void darAltaEstudiante(int idEstudiante) throws DataException {
        try{
            this.darAltaBaja(true, idEstudiante);
        }catch(DataException e){
            throw new DataException(" AdminEstudiante -> darAltaEstudiante(idEstudiante) "+e.getMessage());
        }
    }

    private void darAltaBaja(boolean activo, int idEstudiante) throws DataException {
        PreparedStatement preSt = null;
        try{
            String query = "UPDATE ESTUDIANTE";
            if(activo)
                query +=" SET ESTADO = 1";
            else
                query +=" SET ESTADO = 0";
            query +=" WHERE IDESTUDIANTE = "+idEstudiante;
            preSt = c.prepareStatement(query);
            preSt.executeUpdate();
        }catch(SQLException ex){
            throw new DataException(" AdminEstudiante-> darAltaBaja(activo,idEstudiante) e = "+ex.getMessage());
        }finally{
            SqlManager.closePreSt(preSt);
        }
    }
    @Override
    public boolean existeEstudiante(int idEstudiante) throws DataException {
        boolean res = false;
        ResultSet rs = null;
        PreparedStatement preSt = null;
        String query = "SELECT IDESTUDIANTE";
        query += " FROM CARRERA_ESTUDIANTE";
        query += " WHERE IDESTUDIANTE = "+idEstudiante;
        query += " LIMIT 1";
        try{
            preSt = c.prepareStatement(query);
            rs = preSt.executeQuery();
            if(rs.next())
                res = true;
        }catch(SQLException e){
            throw new DataException(" AdminEstudiante -> existeEstudiante(idEstudiante) "+e.getMessage());
        }finally{
            SqlManager.closeRs(rs);
            SqlManager.closePreSt(preSt);
        }
        return res;
    }
    @Override
    public void deleteEstudiante(int idEstudiante) throws DataException {
        PreparedStatement preSt = null;
        String query = "DELETE FROM DETALLE_ESTUDIANTE WHERE IDDETALLE_ESTUDIANTE="+idEstudiante;
        try{
            preSt = c.prepareStatement(query);
            preSt.executeUpdate();
            // ahora eliminamos sus dependencia
            query = "DELETE FROM ESTUDIANTE WHERE IDESTUDIANTE="+idEstudiante;
            preSt = c.prepareStatement(query);
            preSt.executeUpdate();
        }catch(SQLException e){
            throw new DataException(" AdminEstudiante -> deleteEstudiante(idEstudiante) e = "+e.getMessage());
        }finally{
            SqlManager.closePreSt(preSt);
        }
    }
}
